공공데이터
전기차 충전소

전기차 충전소


charger_lnglat <-  read_rds(glue::glue("{here::here()}/data/charger_lnglat.rds"))

charger_sf <- charger_lnglat |> 
  mutate(across(lng:lat, as.numeric)) |> 
  filter(lat < 50) |> ## 충전소 위경도 오류 ㅠㅠ
  st_as_sf(coords = c("lng", "lat"),
           crs = st_crs(sido_map)) 

charger_sf |> 
  ggplot() +
    geom_sf(aes(geometry = geometry)) +
    theme_void()

ggplot() +
  geom_sf(data = sido_map, aes(geometry = geometry), fill = "transparent", color = "blue") +
  geom_sf(data = charger_sf, aes(geometry = geometry), color = "black", size = 0.1) 

library(leaflet)

leaflet(data = charger_lnglat |> 
          mutate(across(lng:lat, as.numeric)) |> 
          filter(lat < 50)
        ) %>% 
  addProviderTiles(providers$OpenStreetMap) %>% 
  ## 충전소 상세정보
  addMarkers(lng=~lng, lat=~lat, 
             clusterOptions = markerClusterOptions(),
             popup = ~ as.character(paste0("<strong>", 설치장소, "</strong><br>",
                                   "----------------------------------<br>",
                                   "&middot; 주소: ", `주소`, "<br>",
                                   "&middot; 급속: ", `급속충전기_대`, "<br>",
                                   "&middot; 완속: ", `완속충전기_대`, "<br>",
                                   "&middot; 지원차종: ", 지원차종, "<br>"))
             ) |> 
  ## 시도 경계 추가
  addPolygons(data = sido_map,
              opacity = 1.0, fillOpacity = 0.1,
              weight = 1,
              highlightOptions = highlightOptions(color = "black", weight = 3,  bringToFront = TRUE),
              labelOptions = labelOptions(
              style = list("font-weight" = "normal", padding = "3px 8px"),
              textsize = "15px",
              direction = "auto")) 

어린이 교통사고
광명시

보도자료

초등학교 주변 CCTV 현황

library(tidyverse)
library(leaflet)
library(fontawesome)

cctv_tbl <- read_rds(glue::glue("{here::here()}/data/km_cctv_tbl.rds"))
km_sf <- read_rds(glue::glue("{here::here()}/data/km_km_sf.rds"))
km_school <- read_rds(glue::glue("{here::here()}/data/km_km_school.rds"))

cctv_icons <- awesomeIconList(
  "다목적" = makeAwesomeIcon(
    icon = "camera",
    markerColor = "blue",
    library = "fa",
    text = fa("camera")
  ),
  "생활방범" = makeAwesomeIcon(
    icon = "camera",
    markerColor = "green",
    library = "fa",
    text = fa("camera")
  ),
  "쓰레기단속" = makeAwesomeIcon(
    icon = "camera",
    markerColor = "purple",
    library = "fa",
    text = fa("camera")
  ),
  "어린이보호" = makeAwesomeIcon(
    icon = "camera",
    markerColor = "red",
    library = "fa",
    text = fa("camera")
  )
)

cctv_tbl_split <- split(cctv_tbl, cctv_tbl$용도)

l <- leaflet() %>% addProviderTiles(providers$OpenStreetMap)

unique(cctv_tbl$용도) %>%
  purrr::walk( function(df) {
    l <<- l %>%
    ## 행정동
    addPolygons(data = km_sf, 
                opacity = 1.0, fillOpacity = 0.0,
              weight = 1,
              highlightOptions = highlightOptions(color = "black", weight = 3,  bringToFront = TRUE),
              label = ~읍면동,
              labelOptions = labelOptions(
              style = list("font-weight" = "normal", padding = "3px 8px"),
              textsize = "15px",
              direction = "auto")) %>% 
      
    addMarkers(data = km_school, lng=~경도, lat=~위도, clusterOptions = markerClusterOptions(),
              popup = ~ as.character(paste0("<strong>", `학교명`, "</strong><br>",
                                            "--------------------------------<br>",
                                            "&middot; 주소: ", `주소`, "<br>",
                                            "&middot; 설립형태: ", `설립형태`, "<br>",
                                            "&middot; 설립일자: ", `설립일자`))) %>% 
  
    addAwesomeMarkers(data = cctv_tbl_split[[df]], 
                      lng=~경도, lat=~위도, clusterOptions = markerClusterOptions(),
                      group = df,
               icon = ~ cctv_icons[용도],
               popup = ~ as.character(paste0("<strong>", 기기번호, "</strong><br>",
                                             "--------------------------------<br>",
                                             "&middot; 설치위치: ", `도로명주소`, "<br>",
                                             "&middot; 설립대수: ", 설치대수, "<br>",
                                             "&middot; 용도: ", 용도)))
  })

  l %>%
    addLayersControl(
      overlayGroups = unique(cctv_tbl$용도),
      options = layersControlOptions(collapsed = FALSE)
    )

어린이 교통사고 통계

library(janitor)
library(gt)
library(gtExtras)
library(readxl)

accident_2016 <- read_excel(glue::glue("{here::here()}/data/km_accident_2014_2016.xlsx"))
accident_2019 <- read_excel(glue::glue("{here::here()}/data/km_accident_2017_2019.xlsx"))
accident_2022 <- read_excel(glue::glue("{here::here()}/data/km_accident_2020_2022.xlsx"))

accident_tbl <- bind_rows(accident_2016, accident_2019) %>% 
  bind_rows(accident_2022)

accident_tbl %>% 
  group_by(사고유형) %>% 
  summarize(사망자수 = sum(사망자수),
            중상자수 = sum(중상자수),
            경상자수 = sum(경상자수)) %>% 
  adorn_totals(where = "row", name = "합계") %>% 
  adorn_totals(where = "col", name = "합계") %>% 
  ## 표 
  gt::gt() %>% 
    tab_header(
      title = md("광명시 **보행 어린이** 교통사고"),
      subtitle = md("`TAAS` 교통사고분석시스템 (2014~2022)")
    ) %>% 
    gt::cols_align(align = "center") %>% 
    tab_spanner(
      label = "교통사고 어린이 구분",
      columns = c(
        사망자수, 중상자수, 경상자수
      )
    ) %>% 
    gt_theme_538() %>% 
     gt_highlight_rows(
       rows = 사고유형 == "차대사람 - 횡단중",
       fill = "lightgrey",
       bold_target_only = TRUE,
       target_col = everything()
     )
광명시 보행 어린이 교통사고
TAAS 교통사고분석시스템 (2014~2022)
사고유형 교통사고 어린이 구분 합계
사망자수 중상자수 경상자수
차대사람 - 기타 0 11 34 45
차대사람 - 길가장자리구역통행중 0 3 12 15
차대사람 - 보도통행중 0 2 5 7
차대사람 - 차도통행중 0 3 8 11
차대사람 - 횡단중 3 33 59 95
차대차 - 기타 0 1 2 3
차대차 - 측면충돌 0 3 0 3
합계 3 56 120 179

accident_raw <- read_excel(glue::glue("{here::here()}/data/어린이_교통사고건수_시도_시_군_구__20230624195028.xlsx"), sheet = "데이터",
           skip = 2)

accident <- accident_raw %>% 
  select(1, 5:7) %>% 
  set_names(c("시점", "사고건수", "사망자수", "부상자수")) %>% 
  mutate_all(as.integer) %>% 
  pivot_longer(cols=-시점, names_to = "구분", values_to = "건수") %>% 
  mutate(건수 = ifelse(is.na(건수), 0, 건수))

accident %>% 
  ggplot(aes(x = 시점, y=건수, color = 구분)) +
    geom_line() +
    geom_point() +
    labs(title = "광명시 어린이 교통사고건수",
         x = "",
         y = "교통사고건수",
         caption = "출처: KOSIS https://kosis.kr/statHtml/statHtml.do?orgId=101&tblId=DT_1YL202107") +
    theme_minimal(base_family = "MaruBuri")

광명시 유동인구(KT)

데이터출처: 경기도 데이터 분석센터 KT 유동인구 (2018년 1월 ~ 2022년 12월)